mlpfandomcom_ru-20200216-history
Модуль:Тест
local infoboxCharacter = {} --верхний уровень - группа инфобоксов function infoboxCharacter.blockCreate(frame) local args = frame.args --функции --разбиение строки на массив подстрок по определенному символу function split(str, separator, reg) local result = {} --Проверка на образец if (not reg) then regExp = true else regExp = false end --переменные позиций local n local k --управляющие переменные local s = 0 local i = 1 --обработка строки while k ~= str:len() do --поиск сепаратора local substring n, k = str:find(separator, s + 1, regExp) --если поиск не дал результатов if (k nil or n nil) then resulti = str:sub(s + 1, str:len()) break end --если сепаратор найден substring = str:sub(s + 1, n - 1) --добавление результата if substring ~= '' then resulti = substring i = i + 1 end s = k end return result end --проверка параметров function paramCheck(param) if param and param ~= '' then return true else return false end end --создание инфобокса function infoboxCreate(prefix, num) --обработка аргументов local data = {} --имя if paramCheck(argsprefix..'имя') then data.name = argsprefix..'имя' elseif prefix ~= '' then data.name = prefix:sub(1, prefix:len() - 1) else data.name = tostring(mw.title.getCurrentTitle()) end --цветовая тема --цвет фона if paramCheck(argsфона заголовка') then data.bgColor = argsфона заголовка' else data.bgColor = 'inherit' end --цвет текста if paramCheck(argsтекста заголовка') then data.fontColor = argsтекста заголовка' else data.fontColor = 'transparent' end --титул if paramCheck(argsprefix..'титул') then data.title = argsprefix..'титул' end --возраст if paramCheck(argsprefix..'возраст') then data.age = mw.ustring.lower(argsprefix..'возраст') end --вид if paramCheck(argsprefix..'вид') then data.kind = mw.ustring.lower(argsprefix..'вид') end --пол if paramCheck(argsprefix..'пол') then data.gender = mw.ustring.lower(argsprefix..'пол') end --разная информация data.differentInfo = {} --занятие if paramCheck(argsprefix..'занятие') then data.differentInfo+ 1 = {'Занятие', argsprefix..'занятие'} end --место проживания if paramCheck(argsпроживания') then data.differentInfo+ 1 = {'Место проживания', argsпроживания'} end --остальная local dIC = 1 while paramCheck(argsинформация '..dIC) do local dInfo = split(argsинформация '..dIC, ':') if dInfo2 then data.differentInfo+ 1 = {dInfo1, dInfo2} end dIC = dIC + 1 end --озвучка data.voiceInfo = {} --русская if paramCheck(argsозвучка') then data.voiceInfo+ 1 = {'Русская', argsозвучка'} end --английская if paramCheck(argsозвучка') then data.voiceInfo+ 1 = {'Оригинальная', argsозвучка'} end --русская озвучка песен if paramCheck(argsозвучка песен') then data.voiceInfo+ 1 = {'Русская песен', argsозвучка песен'} end --английская озвучка песен if paramCheck(argsозвучка песен') then data.voiceInfo+ 1 = {'Оригинальная песен', argsозвучка песен'} end --другая local vIC = 1 while paramCheck(argsозвучка '..vIC) do local vInfo = split(argsозвучка '..vIC, ':') if vInfo2 then data.voiceInfo+ 1 = {vInfo1, vInfo2} end vIC = vIC + 1 end --родственники data.relativesInfo = {} local rIC = 1 while paramCheck(args'..rIC) do local rInfo = split(args'..rIC, ':') if rInfo2 then data.relativesInfo+ 1 = {rInfo1, rInfo2} end rIC = rIC + 1 end --цвета персонажа data.colorTable = {} if paramCheck(argsprefix..'окрас') then local colors = split(argsprefix..'окрас', '/') data.colorTable+ 1 = {'Окрас', colors} --уточнение цветовой темы if data.bgColor 'inherit' then data.bgColor = colors1 end --определение цвета метки data.cmBackground = colors1 end if paramCheck(argsгривы') then local colors = split(argsгривы', '/') data.colorTable+ 1 = {'Грива', colors} --уточнение цветовой темы if data.fontColor 'transparent' then data.fontColor = colors1 end end if paramCheck(argsглаз') then local colors = split(argsглаз', '/') data.colorTable+ 1 = {'Глаза', colors} end local ctc = 1 while argsцвет '..ctc do local color = split(argsцвет '..ctc, ':') if color2 then local parsedColor = split(color2, '/') data.colorTable+ 1 = {color1, parsedColor} end ctc = ctc + 1 end --метка --общие параметры if not data.cmBackground then data.cmBackground = 'inherit' end data.cmSize = '38x38px' data.cutieMarks = {} local cMC = 1 while aramCheck(args'..cMC) or paramCheck(argsметки'..cMC) do data.cutieMarkscMC = {} --цвет фона if paramCheck(argsфона метки'..cMC) then data.cutieMarkscMC.cmBackground = argsфона метки'..cMC end --размер if paramCheck(argsметки'..cMC) then data.cutieMarkscMC.cmSize = argsметки'..cMC end --изображение if paramCheck(argsprefix..'метка') then data.cutieMarkscMC.cmImage = argsprefix..'метка'..cMC end --описание if paramCheck(argsметки') then data.cutieMarkscMC.cmDescription = argsметки'..cMC end cMC = cMC + 1 end --обёртка содержимого local infoboxOuter = mw.html.create('div') infoboxOuter:attr('id', 'infoboxCharacter'..num) --основа инфобокса local infobox = mw.html.create('div') infoboxOuter:addClass('infoboxCharacter') --функции ---------------------------------------------------------- --создание изображений и кнопок (устаревшее) function imageCreateOld(name, dNone) local image = mw.html.create('div') image:addClass('infBlock') if not argsprefix..'титул' or argsprefix..'титул' '' then image:css('margin', '6px 0 0 0') end if dNone then image:css('display', 'none') end image:wikitext('[[Файл:'..argsname..'|250px|link=]]') return image end function buttonCreateOld(name) local button = mw.html.create('div') button:addClass('infButton') button:css('color', data.fontColor) button:css('background', data.bgColor) button:wikitext(argsname) return button end ------------------------------------------------------------- --создание плашек с информацией о поле и возрасте function kindGenderCreate(text, image) local label = mw.html.create('div') if image then local imgBlock = mw.html.create('div') imgBlock:wikitext('link=') label:css('padding-left', '23px') label:node(imgBlock) else label:css('padding-left', '3px') end label:wikitext(text) return label end --создание строки таблицы function lineCreate(title, text) local line = mw.html.create('tr') local leftColumn = mw.html.create('th') leftColumn:wikitext(title) line:node(leftColumn) local rightColumn = mw.html.create('td') rightColumn:wikitext(text) line:node(rightColumn) return line end --создание пустой сворачивающейся таблицы с заголовком function collapsibleTableCreate(label) local colTable = mw.html.create('table') colTable:addClass('mw-collapsible mw-collapsed') local headerLine = mw.html.create('tr') local header = mw.html.create('th') header:css('background-color', data.bgColor) header:css('color', data.fontColor) header:wikitext(label) header:attr('colspan', '6') headerLine:node(header) colTable:node(headerLine) return colTable end --Создание колорбокса function colorBoxCreate(colors, borderColor) local colorBox = mw.html.create('div') colorBox:addClass('infoboxCharacter_colorBox') if (borderColor) then colorBox:css('border', '2px solid '..borderColor) else colorBox:css('border', '1px solid gray') end width = 100 / #colors for i = 1, #colors do local innerElement = mw.html.create('div') innerElement:css('background-color', colorsi) innerElement:css('width', width..'%') innerElement:attr('title', colorsi) colorBox:node(innerElement) end return colorBox end --содержимое --заголовок local header = mw.html.create('div') header:addClass('infoboxCharacter_header') header:css('background-color', data.bgColor) local headerText = mw.html.create('div') headerText:wikitext(data.name ) headerText:css('color', data.fontColor) header:node(headerText) --титул local title if data.title then title = mw.html.create('div') title:addClass('infoboxCharacter_title') title:wikitext(data.title) end ------------------------------ --изображения и кнопки (устаревшие) local imgOld1, imgOld2, imgOld3, imgOld4 if paramCheck(argsprefix..'изображение') then imgOld1 = imageCreateOld(prefix..'изображение') end if paramCheck(argsprefix..'изображение2') then imgOld2 = imageCreateOld(prefix..'изображение2', true) end if paramCheck(argsprefix..'изображение3') then imgOld3 = imageCreateOld(prefix..'изображение3', true) end if paramCheck(argsprefix..'изображение4') then imgOld4 = imageCreateOld(prefix..'изображение4', true) end local butOld if paramCheck(argsprefix..'изображение2') then butOld = mw.html.create('div') butOld:cssText('width:100%; margin:6px 0 6px; text-align:center') butOld:node(buttonCreateOld(prefix..'подпись1')) butOld:node(buttonCreateOld(prefix..'подпись2')) if paramCheck(argsprefix..'изображение3') then butOld:node(buttonCreateOld(prefix..'подпись3')) end if paramCheck(argsprefix..'изображение4') then butOld:node(buttonCreateOld(prefix..'подпись4')) end end --------------------------- --вид и пол local kindGender if data.kind or data.gender then kindGender = mw.html.create('div') kindGender:addClass('infoboxCharacter_kindGender colorlink') local customKind --вид if data.kind then local kind = mw.html.create('div') local textKind local kindImg if data.kind 'единорог' then textKind = 'Единорог' kindImg = 'Unicorn picto' elseif data.kind 'пегас' then textKind = 'Пегас' kindImg = 'Pegasus picto' elseif data.kind 'земнопони' or data.kind 'земной пони' or data.kind 'земная пони' then if data.gender and data.gender 'жен' then textKind = 'Земная пони' else textKind = 'Земной пони' end kindImg = 'Earthpony picto' elseif data.kind 'аликорн' then textKind = 'Аликорн' kindImg = 'Alicorn picto' else textKind = data.kind customKind = true end local kind = kindGenderCreate(textKind, kindImg) kindGender:node(kind) end --пол if data.gender and data.gender 'муж' or data.gender 'жен' then local gender = mw.html.create("div") local genderText local genderImg if data.gender 'муж' or data.gender 'мужской' then if customKind then genderText = 'Муж.' elseif data.age 'дет' then genderText = 'Жеребёнок' else genderText = 'Жеребец' end genderImg = 'Male picto' else if customKind then genderText = 'Жен.' elseif data.age 'дет' then genderText = 'Кобылка' else genderText = 'Кобыла' end genderImg = 'Female picto' end local gender = kindGenderCreate(genderText, genderImg) kindGender:node(gender) end end --разная информация local diffInfoTable if #data.differentInfo ~= 0 then diffInfoTable = mw.html.create('table') diffInfoTable:addClass('infoboxCharacter_infoTable') for i = 1, #data.differentInfo do local line = lineCreate(data.differentInfoi1, data.differentInfoi2) diffInfoTable:node(line) end end --озвучка local voiceTable if #data.voiceInfo ~= 0 then voiceTable = collapsibleTableCreate('Озвучка') voiceTable:addClass('infoboxCharacter_collapsibleInfoTable') for i = 1, #data.voiceInfo do local line = lineCreate(data.voiceInfoi1, data.voiceInfoi2) voiceTable:node(line) end end --родственники local relativesTable if #data.relativesInfo ~= 0 then relativesTable = collapsibleTableCreate('Родственники') relativesTable:addClass('infoboxCharacter_collapsibleInfoTable') for i = 1, #data.relativesInfo do local line = lineCreate(data.relativesInfoi1, data.relativesInfoi2) relativesTable:node(line) end end --внешний вид local appearanceTable if data.colorTable1 or data.cmImage or data.cmDescription then appearanceTable = collapsibleTableCreate('Внешний вид') appearanceTable:addClass('infoboxCharacter_appearanceTable') --цвета if data.colorTable1 then local length = #data.colorTable local colspan local tr for i = 1, length do if length - i 1 and length % 3 2 then colspan = '3' elseif length - i 0 and length % 3 1 then colspan = '6' else colspan = '2' end if i % 3 1 then tr = mw.html.create('tr') end local th = mw.html.create('th') th:attr('colspan', colspan) th:wikitext(data.colorTablei1..' ') local colorBox = colorBoxCreate(data.colorTablei2) th:node(colorBox) tr:node(th) if (i % 3 0 or length - i 0) then appearanceTable:node(tr) end end end --метка --описание --if data.cmImage or data.cmDescription then local tr = mw.html.create('tr') local td = mw.html.create('td') td:attr("colspan", "6") local label = mw.html.create('span') label:wikitext('Метка') if data.cmDescription then local description = mw.html.create('div') if data.cmImage then description:addClass('infoboxCharacter_appearanceTable_cmDescription') else description:addClass('infoboxCharacter_appearanceTable_cmDescriptionOnly') end description:node(label) description:wikitext(' '..data.cmDescription) td:node(description) end --изображение if data.cmImage then local imageWrap = mw.html.create('div') if data.cmDescription then imageWrap:addClass('infoboxCharacter_appearanceTable_cmImage') else imageWrap:addClass('infoboxCharacter_appearanceTable_cmImageOnly') imageWrap:node(label) end local image = mw.html.create('div')-- --image:wikitext(''..data.cmSize..'|link=') -- image:css("background-color", data.cmBackground) -- imageWrap:node(image) -- td:node(imageWrap) --end --tr:node(td) -- appearanceTable:node(tr) -- end end --галерея local gallery if paramCheck(argsprefix..'галерея') then gallery = mw.html.create('div') gallery:addClass('infoboxCharacter_gallery colorlink') gallery:css('color', data.fontColor) gallery:css('background-color', data.bgColor) gallery:wikitext('[['..argsprefix..'галерея'..'|Галерея]]') end --построение infobox:node(header) if title then infobox:node(title) end ---------------------------------- --изображения и кнопки (устаревшие) if imgOld1 then infobox:node(imgOld1) end if imgOld2 then infobox:node(imgOld2) end if imgOld3 then infobox:node(imgOld3) end if imgOld4 then infobox:node(imgOld4) end if butOld then infobox:node(butOld) end ------------------------------- if kindGender then infobox:node(kindGender) end if diffInfoTable then infobox:node(diffInfoTable) end if voiceTable then infobox:node(voiceTable) end if relativesTable then infobox:node(relativesTable) end if appearanceTable then infobox:node(appearanceTable) end if gallery then infobox:node(gallery) end infoboxOuter:node(infobox) return {infoboxOuter, data} end --обёртка блока инфобоксов local infoboxGroup = mw.html.create('div') infoboxGroup:attr('id', 'infoboxCharacterGroup') infoboxGroup:addClass('infoboxCharacter_group') --создание инфобоксов if args1' then local infoboxTable = {} local ibc = 1 while args'..ibc do infoboxTableibc = infoboxCreate(args'..ibc..' ', ibc) infoboxTableibc1:attr('data-name', infoboxTableibc2.name) infoboxTableibc1:attr('data-bgcolor', infoboxTableibc2.bgColor) infoboxTableibc1:attr('data-fontcolor', infoboxTableibc2.fontColor) ibc = ibc + 1 end if #infoboxTable > 1 then local isbContainer = mw.html.create('div') isbContainer:attr('id', 'isbContainer') isbContainer:addClass('isbContainer') local prevKey = mw.html.create('div') prevKey:wikitext(infoboxTable#infoboxTable2.name) prevKey:css('background-color', infoboxTable#infoboxTable2.bgColor) prevKey:css('color', infoboxTable#infoboxTable2.fontColor) isbContainer:node(prevKey) if #infoboxTable > 2 then local nextKey = mw.html.create('div') nextKey:wikitext(infoboxTable22.name) nextKey:css('background-color', infoboxTable22.bgColor) nextKey:css('color', infoboxTable22.fontColor) isbContainer:node(nextKey) end infoboxGroup:node(isbContainer) end for i = 1, #infoboxTable do if i > 1 then infoboxTablei1:css('display', 'none') end infoboxGroup:node(infoboxTablei1) end else local infobox = infoboxCreate('', 1) infoboxGroup:node(infobox1) end return infoboxGroup end return infoboxCharacter